#!/usr/bin/gawk -f
# Extract GMP-style documentation from source using AsciiDoc format.
# Fragile:
# - requires function definition/declaration to end with ")\n" or ");" or ") {"
# - does not play nice with function pointer parameters

# Look for the magic string "/*@manual "
/^\/\*@manual / {
  outfile = "gen/" gensub(".*manual ", "", 1) ".txt"
  print "Writing to " outfile
  n = 0
  getline
  # Stop at the line "*/".
  while ($0 != "*/") {
    a[n] = $0
    n++
    getline
  }

# Simple version with no markup:
#  do {
#     getline
#     print
#  } while (!match($0, ";") && !match($0, "{"))

# Mark up bits of the function declaration with AsciiDoc, e.g:
# "int main(int argc, char *argv[]);" should become
# "int *main*('int argc', 'char *argv[]');"
# Also suppress "static inline".
  getline

# Handle variable declarations.
  if (!match($0, "\\(")) {
    s = gensub("([^ ]*);", "*\\1*", 1)  # Bold variable name.
# Handle macro declarations.
  } else if (match($0, "^#define")) {
    s = gensub("^#define *(.*[^ ]) *\\\\$", "*\\1*", 1)
# Otherwise it's a function.
  } else {

    sub("static inline ", "")
    s = gensub("(\\w*)\\(", " *\\1*(", 1)  # Bold function name.
    s = gensub("\\((.*$)", "('\\1", 1, s)  # First parameter.
    gsub(", *", "', '", s)  # Separating commas.
    gsub("_ptr", "_t", s)
# Handle multi-line function declarations.
    while (!match(s, ");") && !match(s, ") *$") && !match(s, ") *{")) {
      getline
      gsub("^ *", "")      # Remove leading whitespace.
      gsub(", *", "', '")  # Commas again.
      gsub("_ptr", "_t")
      s = s $0
    }
    s = gensub("(.*)\\)", "\\1')", 1, s)  # Last parameter
    gsub("_ptr", "_t", s)
    gsub(")[^)]*$", ")", s);
  }

  print s "\n" > outfile
  if (n > 0) {
    print "____" > outfile
    for(i = 0; i < n; i++) {
      print a[i] > outfile
    }
    print "____" > outfile
  }
}
